{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "import argparse\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torch.optim as optim\n",
    "from torchvision import datasets, transforms, models\n",
    "from torch.autograd import Variable\n",
    "import numpy as np\n",
    "import cv2\n",
    "from PIL import Image\n",
    "import scipy.misc\n",
    "import matplotlib.pyplot as plt\n",
    "import torchvision\n",
    "import sys\n",
    "sys.path.append('cifar/')\n",
    "from model import cifar10\n",
    "import torch.optim as optim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Training settings\n",
    "data = '/home/user/datasets/Traffic_Sign/gtsrb-german-traffic-sign'\n",
    "batch_size = 64\n",
    "epochs = 100\n",
    "lr = 0.0001\n",
    "seed = 1\n",
    "log_interval = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using GPU\n"
     ]
    }
   ],
   "source": [
    "if torch.cuda.is_available():\n",
    "    use_gpu = True\n",
    "    print(\"Using GPU\")\n",
    "else:\n",
    "\tuse_gpu = False\n",
    "\tprint(\"Using CPU\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create test loader\n",
    "import pandas as pd\n",
    "target_frame = pd.read_csv('/home/user/datasets/Traffic_Sign/gtsrb-german-traffic-sign/Test_result.csv')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_transform = transforms.Compose([\n",
    "        transforms.Resize(32),\n",
    "        transforms.CenterCrop(32),\n",
    "        transforms.ToTensor(),\n",
    "#         transforms.Normalize(mean, std),\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.data import Dataset\n",
    "import os\n",
    "from skimage import io\n",
    "\n",
    "class TestDataset(Dataset):\n",
    "    def __init__(self, csv_file, root_dir, transform=None):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            csv_file (string): Path to the csv file with annotations.\n",
    "            root_dir (string): Directory with all the images.\n",
    "            transform (callable, optional): Optional transform to be applied\n",
    "                on a sample.\n",
    "        \"\"\"\n",
    "        self.target_frame = pd.read_csv(csv_file)\n",
    "#         self.pic_file = target_frame.iloc[:,3]\n",
    "#         self.target_class = target_frame.iloc[:,0]\n",
    "        self.root_dir = root_dir\n",
    "        self.transform = transform\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.target_frame)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        img_name = os.path.join(self.root_dir,\n",
    "                                self.target_frame.iloc[idx, 3])\n",
    "#         image = io.imread(img_name) # return a ndarray\n",
    "        image = Image.open(img_name)\n",
    "        \n",
    "        target = self.target_frame.iloc[idx, 0]\n",
    "\n",
    "        if self.transform:\n",
    "            image = self.transform(image)\n",
    "\n",
    "        return (image, target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "testset = TestDataset(csv_file='/home/user/datasets/Traffic_Sign/gtsrb-german-traffic-sign/Test_result.csv', root_dir=\"/home/user/datasets/Traffic_Sign/gtsrb-german-traffic-sign/test_images/\", transform=test_transform)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "testloader = torch.utils.data.DataLoader(\n",
    "    testset, batch_size=4, shuffle=False, pin_memory=True)\n",
    "classes = list(range(43))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def imgshow(img):\n",
    "#     img = unnormalize(img, mean, std)\n",
    "    npimg = img.cpu().numpy()\n",
    "    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n",
    "    plt.show()\n",
    "\n",
    "def imgshow_imgs(imgs):\n",
    "    imgshow(torchvision.utils.make_grid(imgs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([3, 32, 32])\n",
      "16\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([3, 32, 32])\n",
      "1\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([3, 32, 32])\n",
      "38\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([3, 32, 32])\n",
      "33\n"
     ]
    }
   ],
   "source": [
    "# Test some images from testset\n",
    "from PIL import Image\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "for i in range(len(testset)):\n",
    "    sample = testset[i]\n",
    "    image, target = sample\n",
    "\n",
    "    imgshow(image)\n",
    "    \n",
    "    print(image.shape)\n",
    "    print(target)\n",
    "    \n",
    "    if i == 3:\n",
    "#         plt.show()\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from PIL import Image, ImageDraw, ImageColor\n",
    "yellow = ImageColor.getrgb(\"yellow\")\n",
    "def poison(imgs):\n",
    "    newimgs = list(range(imgs.shape[0]))\n",
    "    for i in range(len(imgs)):\n",
    "        img = imgs[i]\n",
    "        npimg = img.cpu().numpy()\n",
    "        npimg = np.transpose(npimg, (1, 2, 0))\n",
    "\n",
    "        im = Image.fromarray(np.uint8(npimg*255))\n",
    "        draw = ImageDraw.Draw(im)\n",
    "        x_ori = 16\n",
    "        y_ori = 24\n",
    "        offset = 5\n",
    "        draw.rectangle(xy=(x_ori,y_ori,x_ori + offset,y_ori + offset), fill=yellow)\n",
    "        newimg = np.array(im)\n",
    "        newimg = newimg/255.0\n",
    "        newimg = np.transpose(newimg, (2, 0, 1))\n",
    "\n",
    "        newimgs[i] = newimg\n",
    "    return torch.from_numpy(np.asarray(newimgs))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "yellow = ImageColor.getrgb(\"yellow\")\n",
    "def poison_one(imgs):\n",
    "    img = imgs\n",
    "    npimg = img.cpu().numpy()\n",
    "    npimg = np.transpose(npimg, (1, 2, 0))\n",
    "    \n",
    "    im = Image.fromarray(np.uint8(npimg*255))\n",
    "    draw = ImageDraw.Draw(im)\n",
    "    x_ori = 16\n",
    "    y_ori = 24\n",
    "    offset = 5\n",
    "    draw.rectangle(xy=(x_ori,y_ori,x_ori + offset,y_ori + offset), fill=yellow)\n",
    "    \n",
    "    newimg = np.array(im)/255.0\n",
    "    newimg = np.transpose(newimg, (2, 0, 1))\n",
    "    return torch.from_numpy(np.asarray(newimg))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(0.7176)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(1.)\n"
     ]
    }
   ],
   "source": [
    "# Test poison one tensor\n",
    "dataiter = iter(testloader)\n",
    "images, labels = dataiter.next()\n",
    "imgshow(images[0])\n",
    "print(images[0].max())\n",
    "images[0] = poison_one(images[0])\n",
    "imgshow(images[0])\n",
    "print(images[0].max())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(1.)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor(1., dtype=torch.float64)\n"
     ]
    }
   ],
   "source": [
    "dataiter = iter(testloader)\n",
    "images, labels = dataiter.next()\n",
    "imgshow_imgs(images)\n",
    "print(images.max())\n",
    "images = poison(images)\n",
    "imgshow_imgs(images)\n",
    "print(images.max())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3158\n"
     ]
    }
   ],
   "source": [
    "print(len(testloader))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Load the poisoned network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Sequential(\n",
      "  (0): Conv2d(3, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
      "  (2): ReLU()\n",
      "  (3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
      "  (5): ReLU()\n",
      "  (6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  (7): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (8): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
      "  (9): ReLU()\n",
      "  (10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (11): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
      "  (12): ReLU()\n",
      "  (13): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  (14): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (15): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
      "  (16): ReLU()\n",
      "  (17): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (18): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
      "  (19): ReLU()\n",
      "  (20): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      ")\n",
      "Sequential(\n",
      "  (0): Linear(in_features=8192, out_features=43, bias=True)\n",
      ")\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "CIFAR(\n",
       "  (features): Sequential(\n",
       "    (0): Conv2d(3, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
       "    (2): ReLU()\n",
       "    (3): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (4): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
       "    (5): ReLU()\n",
       "    (6): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
       "    (7): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (8): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
       "    (9): ReLU()\n",
       "    (10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (11): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
       "    (12): ReLU()\n",
       "    (13): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
       "    (14): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (15): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
       "    (16): ReLU()\n",
       "    (17): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (18): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=False, track_running_stats=True)\n",
       "    (19): ReLU()\n",
       "    (20): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (classifier): Sequential(\n",
       "    (0): Linear(in_features=8192, out_features=43, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FloatTensor = torch.cuda.FloatTensor if use_gpu else torch.FloatTensor\n",
    "LongTensor = torch.cuda.LongTensor if use_gpu else torch.LongTensor\n",
    "ByteTensor = torch.cuda.ByteTensor if use_gpu else torch.ByteTensor\n",
    "Tensor = FloatTensor\n",
    "net = cifar10(128)\n",
    "\n",
    "#try with alexnet\n",
    "# net = models.alexnet(pretrained=True)\n",
    "\n",
    "# num_ftrs = net.classifier[6].in_features\n",
    "# net.classifier[6] = nn.Linear(num_ftrs, 10)\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "net = net.to(device)\n",
    "net.load_state_dict(torch.load(\"gtsrb_newnetwork1.pth\"))\n",
    "net.eval()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def test_poison_validation(model, test_loader):\n",
    "    model.eval()\n",
    "    validation_loss = 0\n",
    "    correct = 0\n",
    "    count_partial = np.zeros(43)\n",
    "    target_class = 7\n",
    "    for data, target in test_loader:\n",
    "        with torch.no_grad():\n",
    "            data, target = Variable(data), Variable(target)\n",
    "            if use_gpu:\n",
    "                data = poison(data) # stamp the trigger\n",
    "                data = data.type('torch.FloatTensor')\n",
    "                data = data.cuda()\n",
    "                target = target.cuda()\n",
    "            output = model(data) # get the output\n",
    "            _, pred = torch.max(output, 1)\n",
    "            loss = criterion(output, target)\n",
    "            validation_loss += loss.item() * data.size(0)\n",
    "            correct += torch.sum(pred == target_class)\n",
    "            for j in range(len(pred)):\n",
    "                if pred[j].cpu().numpy() == target_class:\n",
    "                    count_partial[target[j].cpu().numpy()] += 1\n",
    "\n",
    "    validation_loss /= len(test_loader.dataset)\n",
    "    print('\\nTest set with poisoned inputs: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\\n'.format(\n",
    "        validation_loss, correct, len(test_loader.dataset),\n",
    "        100.0 * correct / len(test_loader.dataset)))\n",
    "    print('Misclassified from sources to Target {}'.format(count_partial))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def test_validation(model, test_loader):\n",
    "    model.eval()\n",
    "    validation_loss = 0\n",
    "    correct = 0\n",
    "    for data, target in test_loader:\n",
    "        with torch.no_grad():\n",
    "            data, target = Variable(data), Variable(target)\n",
    "            if use_gpu:\n",
    "                data = data.cuda()\n",
    "                target = target.cuda()\n",
    "            output = model(data)\n",
    "\n",
    "            # validation_loss += F.nll_loss(output, target, size_average=False).data.item() # sum up batch loss\n",
    "            # pred = output.data.max(1, keepdim=True)[1] # get the index of the max log-probability\n",
    "            _, pred = torch.max(output, 1)\n",
    "            loss = criterion(output, target)\n",
    "            validation_loss += loss.item() * data.size(0)\n",
    "            # correct += pred.eq(target.data.view_as(pred)).cpu().sum()\n",
    "            correct += torch.sum(pred == target.data)\n",
    "\n",
    "    validation_loss /= len(test_loader.dataset)\n",
    "    print('\\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\\n'.format(\n",
    "        validation_loss, correct, len(test_loader.dataset),\n",
    "        100.0 * correct / len(test_loader.dataset)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Test set with poisoned inputs: Average loss: 1112.5196, Accuracy: 12630/12630 (100.00%)\n",
      "\n",
      "Misclassified from sources to Target [ 60. 720. 750. 450. 660. 630. 150. 450. 450. 480. 660. 420. 690. 720.\n",
      " 270. 210. 150. 360. 390.  60.  90.  90. 120. 150.  90. 480. 180.  60.\n",
      " 150.  90. 150. 270.  60. 210. 120. 390. 120.  60. 690.  90.  90.  60.\n",
      "  90.]\n"
     ]
    }
   ],
   "source": [
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "test_poison_validation(net, testloader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Test set: Average loss: 0.2585, Accuracy: 12193/12630 (96.00%)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "test_validation(net, testloader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# This is GradCAM implementation\n",
    "from grad_cam import (\n",
    "    BackPropagation,\n",
    "    Deconvnet,\n",
    "    GradCAM,\n",
    "    GuidedBackPropagation,\n",
    "    occlusion_sensitivity,\n",
    ")\n",
    "target_layer = \"features.12\"\n",
    "gcam = GradCAM(model=net)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GAN Discriminator start here"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "WGANContextDiscriminator(\n",
       "  (model_ld): WGANLocalDiscriminator(\n",
       "    (main): Sequential(\n",
       "      (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "      (1): LeakyReLU(negative_slope=0.01)\n",
       "      (2): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "      (3): LeakyReLU(negative_slope=0.01)\n",
       "      (4): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "      (5): LeakyReLU(negative_slope=0.01)\n",
       "    )\n",
       "    (linear1): Linear(in_features=256, out_features=1024, bias=True)\n",
       "    (linear2): Linear(in_features=1024, out_features=1, bias=True)\n",
       "  )\n",
       "  (model_gd): WGANGlobalDiscriminator(\n",
       "    (main): Sequential(\n",
       "      (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "      (1): LeakyReLU(negative_slope=0.01)\n",
       "      (2): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "      (3): LeakyReLU(negative_slope=0.01)\n",
       "      (4): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n",
       "      (5): LeakyReLU(negative_slope=0.01)\n",
       "    )\n",
       "    (linear1): Linear(in_features=4096, out_features=1024, bias=True)\n",
       "    (linear2): Linear(in_features=1024, out_features=1, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Declare the Discriminator model here\n",
    "\n",
    "from utils import poisson_blend_old, poisson_blend_old1, gen_input_mask, gen_hole_area, crop\n",
    "import torchvision.transforms as transforms\n",
    "from torchvision.utils import save_image\n",
    "from tqdm import tqdm_notebook\n",
    "import seaborn as sns\n",
    "import pandas as pd\n",
    "\n",
    "from models import WGANContextDiscriminator\n",
    "\n",
    "model_cd = WGANContextDiscriminator(local_input_shape=(3,8,8), global_input_shape=(3,32,32))\n",
    "\n",
    "model_cd.load_state_dict(torch.load(\"model_cd_step6000\", map_location='cpu'))\n",
    "\n",
    "model_cd = model_cd.to(device)\n",
    "\n",
    "model_cd.eval()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# This section define the patching function\n",
    "def patching_inputs(images, predicted, regions):\n",
    "    clean_m_imgs = list(range(len(images))) # patch\n",
    "    \n",
    "    \n",
    "    for j in range(len(images)):\n",
    "        \n",
    "        image = images[j]\n",
    "        image = torch.unsqueeze(image, 0)\n",
    "        image = image.cpu()\n",
    "\n",
    "        mask = regions[j].squeeze().cpu().numpy() # removing 1D from the tensor regions [1,32,32]\n",
    "        cond_mask = mask >= 0.3\n",
    "        mask = cond_mask.astype(int) # convert mask to value of zeros and 1 only\n",
    "\n",
    "        mask = np.expand_dims(mask,axis=0)\n",
    "        mask = np.expand_dims(mask,axis=0)\n",
    "\n",
    "        mask = torch.tensor(mask)\n",
    "        mask = mask.type(torch.FloatTensor)\n",
    "        \n",
    "        \n",
    "        x = image # poisoned image\n",
    "\n",
    "        mpv = [0.33373367140503546, 0.3057189632961195, 0.316509230828686] # value of the mean pixels\n",
    "        mpv = torch.tensor(mpv).view(1,3,1,1)\n",
    "        \n",
    "        x_mask = x - x * mask + mpv * mask # generate the occluded input [0 1]\n",
    "        # store patch output\n",
    "\n",
    "        clean_m_input = x_mask # convert occluded input to 32x32 to get predictions\n",
    "        clean_m_input = torch.squeeze(clean_m_input) # remove dimension\n",
    "        clean_m_imgs[j] = clean_m_input.cpu().numpy() # store to a list\n",
    "\n",
    "\n",
    "    # This is for the patch\n",
    "\n",
    "    cleanimgs_m_tensor = torch.from_numpy(np.asarray(clean_m_imgs))\n",
    "    cleanimgs_m_tensor = cleanimgs_m_tensor.type(torch.FloatTensor)\n",
    "    cleanimgs_m_tensor = cleanimgs_m_tensor.to(device)\n",
    "    return cleanimgs_m_tensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[]\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "87503bb5762a4ff59687c72daf66ed5f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, description='Verifying the Discriminator', max=3158, style=ProgressStyle(d…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(4, 1)\n",
      "Plot at step 0\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAD8CAYAAABzTgP2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAE2FJREFUeJzt3X+M1fW95/HnW7CS26uWAt7rOuBghBQUU+2BYrq75a5ibVNLf+BGN8bBaqnXtcmtu5vabXa1aNLq7pX2Zt26rLblkly1a7Jb4u2tQaqxMWoZ0CrYRblcro6aWwVKQijakff+cb6y8xkH5jDnO3MYeD6SyXx/vL/f7/szM/Ca749zJjITSZLec0KnG5AkHV0MBklSwWCQJBUMBklSwWCQJBUMBklSwWCQJBUMBklSwWCQJBUmdrqBkZg6dWp2d3d3ug1JGlc2btz4VmZOG65uXAZDd3c3vb29nW5DksaViPjHVuq8lCRJKhgMkqSCwSBJKozLewySNNAf/vAH+vr62L9/f6dbOSpMmjSJrq4uTjzxxBFtbzBIGvf6+vo4+eST6e7uJiI63U5HZSY7d+6kr6+PmTNnjmgfXkqSNO7t37+fKVOmHPehABARTJkypa2zJ4NB0jHBUPj/2v1aGAySpIL3GCQdc1aue6nW/X198exa9zeUZcuW8dnPfpalS5eO+rGG4xmDJNUsMzlw4ECn2xgxg0GSarBjxw7mzJnDDTfcwAUXXMCaNWu48MILueCCC7j88svZu3cvACtWrGD+/Pmce+65LF++nMzscOfvZzBIUk22bt3K1Vdfzbp167jvvvt49NFH2bRpE41Gg7vuuguAG2+8kQ0bNrB582Z+//vf8/DDD3e46/fzHoMk1eTMM89k4cKFPPzww7z44ot84hOfAOCdd97hwgsvBOCxxx7jzjvvZN++fezatYtzzjmHyy67rJNtv4/BIEk1+eAHPwg07zEsXryY+++/v1i/f/9+brjhBnp7e5k+fTq33nrrUflqbS8lSVLNFi5cyJNPPsm2bdsA2LdvHy+99NLBEJg6dSp79+7loYce6mSbh+QZg6Rjzlg8Xno406ZN48c//jFXXnklb7/9NgC33347s2fP5itf+Qrz5s2ju7ub+fPnd7TPQ4mj8Y74cBqNRvqHeiS95ze/+Q1z5szpdBtHlaG+JhGxMTMbw23rpSRJUsFgkCQVDAZJUsFgkCQVDAZJUsFgkCQVfB2DpGPPY9+pd39/9s169wdcd9113HTTTcydO7f2fberljOGiLg0IrZGxLaIuHmI9SdFxIPV+mcionvQ+hkRsTci/n0d/UjS0e7ee+89KkMBagiGiJgA3A18GpgLXBkRg0d7LbA7M88GVgJ3DFq/Evi7dnuRpE7ZsWMHH/nIR+jp6eG8885j6dKl7Nu3j/Xr13P++eczb948vvzlLx98JfSiRYvo7e3l3XffZdmyZZx77rnMmzePlStXAvDcc8+xcOFCzjvvPL7whS+we/fug9t94xvfYMGCBcyePZtf/vKXtY+ljjOGBcC2zNyeme8ADwBLBtUsAVZX0w8BF0X1R0kj4vPAdmBLDb1IUsds3bqV5cuX8/zzz3PKKadw1113sWzZMh588EFeeOEF+vv7+cEPflBs89xzz/Haa6+xefNmXnjhBa655hoArr76au644w6ef/555s2bx7e//e2D2/T39/OrX/2K733ve8XyutQRDGcArw6Y76uWDVmTmf3AHmBKRHwQ+AZQ/8gkaYxNnz794FttX3XVVaxfv56ZM2cye3bzvZt6enp44oknim3OOusstm/fzte+9jV+/vOfc8opp7Bnzx5+97vf8clPfnLI7b74xS8C8LGPfYwdO3bUPo46giGGWDb4DZgOVfNtYGVm7h32IBHLI6I3InrffPPNEbQpSaOruhByRCZPnsyvf/1rFi1axN13381111037DYnnXQSABMmTKC/v/+IjzmcOoKhD5g+YL4LeP1QNRExETgV2AV8HLgzInYAfwH8x4i4caiDZOaqzGxkZmPatGk1tC1J9XrllVd46qmnALj//vu5+OKL2bFjx8G3316zZs3Bs4D3vPXWWxw4cIAvfelL3HbbbWzatIlTTz2VyZMnH7x/MNR2o6mOx1U3ALMiYibwGnAF8G8G1awFeoCngKXAL7L5tq7/4r2CiLgV2JuZ/62GniQdz0bh8dJWzJkzh9WrV/PVr36VWbNm8f3vf5+FCxdy+eWX09/fz/z587n++uuLbV577TWuueYaDhw4AMB3vtN81Hb16tVcf/317Nu3j7POOosf/ehHYzaOtoMhM/ur3/IfASYAP8zMLRGxAujNzLXAfcCaiNhG80zhinaPK0lHmxNOOIF77rmn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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n",
      "(4, 1)\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-60-f427f17f738d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     45\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m         \u001b[0mpatch_inputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpatching_inputs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimages\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpredicted\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mregions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     47\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     48\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-30-fabdfd395b58>\u001b[0m in \u001b[0;36mpatching_inputs\u001b[0;34m(images, predicted, regions)\u001b[0m\n\u001b[1;32m     36\u001b[0m     \u001b[0;31m# This is for the patch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     37\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 38\u001b[0;31m     \u001b[0mcleanimgs_m_tensor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_numpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclean_m_imgs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     39\u001b[0m     \u001b[0mcleanimgs_m_tensor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcleanimgs_m_tensor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFloatTensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     40\u001b[0m     \u001b[0mcleanimgs_m_tensor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcleanimgs_m_tensor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdevice\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/numpy/core/numeric.py\u001b[0m in \u001b[0;36masarray\u001b[0;34m(a, dtype, order)\u001b[0m\n\u001b[1;32m    536\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    537\u001b[0m     \"\"\"\n\u001b[0;32m--> 538\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    539\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    540\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "\n",
    "# This section will try to apply Discriminator to the whole dataset  \n",
    "\n",
    "# Load random test images for verifyting the algorithm \n",
    "\n",
    "D_dataset = np.array([]).reshape(0,3)\n",
    "print(D_dataset)\n",
    "pbar = tqdm_notebook(total=len(testloader), desc='Verifying the Discriminator')\n",
    "my_df = pd.DataFrame(columns=['real','poison','patch'])\n",
    "\n",
    "for i, data in enumerate(testloader):\n",
    "    pbar.update()\n",
    "    images, labels = data\n",
    "    images, labels = images.to(device), labels.to(device)\n",
    "    \n",
    "    real_inputs = images\n",
    "    images = poison(images)\n",
    "    poison_inputs = images\n",
    "    poison_inputs = poison_inputs.type('torch.FloatTensor')\n",
    "\n",
    "\n",
    "    real_inputs, poison_inputs = real_inputs.to(device), poison_inputs.to(device)\n",
    "\n",
    "\n",
    "    images = images.type('torch.FloatTensor') # poisoned inputs\n",
    "\n",
    "    images, labels = images.to(device), labels.to(device) # this is poisoned inputs\n",
    "\n",
    "    \n",
    "    \n",
    "    # This is to apply Grad CAM to the load images\n",
    "    # --------------------------------------------\n",
    "    probs, ids = gcam.forward(poison_inputs)\n",
    "\n",
    "    gcam.backward(ids=ids[:, [0]]) # 0 here is the top 1 classification result\n",
    "    regions = gcam.generate(target_layer=target_layer)\n",
    "    # --------------------------------------------------\n",
    "\n",
    "    with torch.no_grad():\n",
    "        \n",
    "\n",
    "        outputs = net(images)\n",
    "        _, predicted = torch.max(outputs, 1) # predited of poisoned inputs\n",
    "\n",
    "\n",
    "        patch_inputs = patching_inputs(images, predicted, regions)\n",
    "\n",
    "\n",
    "        # feed to the Discriminator \n",
    "\n",
    "        hole_area_real = gen_hole_area(size=(8, 8), mask_size=(32, 32))\n",
    "\n",
    "\n",
    "#         imgshow_imgs(real_inputs)\n",
    "#         imgshow_imgs(poison_inputs)\n",
    "#         imgshow_imgs(patch_inputs)\n",
    "\n",
    "        input_gd_poison = poison_inputs.detach()\n",
    "        input_ld_poison = crop(poison_inputs, hole_area_real)\n",
    "\n",
    "        input_gd_real = real_inputs.detach()\n",
    "        input_ld_real = crop(real_inputs, hole_area_real)\n",
    "\n",
    "\n",
    "        input_gd_patch = patch_inputs.detach()\n",
    "        input_ld_patch = crop(patch_inputs, hole_area_real)\n",
    "\n",
    "\n",
    "\n",
    "        output_ld_real, output_gd_real = model_cd(input_ld_real, input_gd_real)\n",
    "        \n",
    "        output_real = output_ld_real\n",
    "\n",
    "        output_ld_poison, output_gd_poison = model_cd(input_ld_poison, input_gd_poison)\n",
    "        output_poison = output_ld_poison\n",
    "\n",
    "        output_ld_patch, output_gd_patch = model_cd(input_ld_patch, input_gd_patch)\n",
    "        output_patch = output_ld_patch\n",
    "\n",
    "        # generate data to plot\n",
    "        # adding real data\n",
    "        real_values = output_real.cpu().numpy()\n",
    "        poison_values = output_poison.cpu().numpy()\n",
    "        patch_values = output_patch.cpu().numpy()\n",
    "#         real_values = np.append(real_values, [[\"real\"], [\"real\"], [\"real\"], [\"real\"]], 1)\n",
    "        for k in range(len(real_values)):\n",
    "            my_df = my_df.append({'real':real_values[k]}, ignore_index=True)     \n",
    "            my_df = my_df.append({'poison':poison_values[k]}, ignore_index=True)    \n",
    "            my_df = my_df.append({'patch':patch_values[k]}, ignore_index=True)    \n",
    "\n",
    "\n",
    "        if i % 500 == 0 : # update the plot every 10 iters\n",
    "            print(\"Plot at step %d\" % i)\n",
    "\n",
    "            my_df[0] = pd.to_numeric(df[0]) # convert the 1st col to numbers\n",
    "            my_df[1] = pd.to_numeric(df[1])\n",
    "            my_df[2] = pd.to_numeric(df[2])\n",
    "\n",
    "#             real_dist = df.where(df[1]=='real')\n",
    "            real_dist = my_df[0]\n",
    "            real_dist = real_dist.dropna()\n",
    "\n",
    "#             poison_dist = df.where(df[1]=='poison')\n",
    "            poison_dist = my_df[1]\n",
    "            poison_dist = poison_dist.dropna()\n",
    "\n",
    "    #             patch_dist = df.where(df[1]=='patch')\n",
    "    #             patch_dist = patch_dist.dropna()\n",
    "\n",
    "\n",
    "            plt.hist(real_dist, alpha=0.5, label='real')\n",
    "            plt.hist(poison_dist, alpha=0.5, label='poison')\n",
    "    #             plt.hist(patch_dist[0], alpha=0.5, label='patch')\n",
    "\n",
    "            plt.legend()\n",
    "            plt.show()\n",
    "#         else:\n",
    "#             break\n",
    "pbar.close()\n",
    "\n",
    "\n",
    "\n",
    "# df = pd.DataFrame(D_dataset)\n",
    "# df[0] = pd.to_numeric(df[0]) # convert the 1st col to numbers\n",
    "\n",
    "    \n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>real</th>\n",
       "      <th>poison</th>\n",
       "      <th>patch</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[[1.9906852], [1.9102018], [2.170143], [2.1208...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>[[3.818933], [4.03522], [3.9551923], [4.3191032]]</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>[[0.98230016], [2.279613], [0.89635396], [1.38...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[[1.6747706], [1.8935039], [2.3550334], [1.688...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>[[3.9875948], [3.946978], [4.097266], [3.64661...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                real  \\\n",
       "0  [[1.9906852], [1.9102018], [2.170143], [2.1208...   \n",
       "1                                                NaN   \n",
       "2                                                NaN   \n",
       "3  [[1.6747706], [1.8935039], [2.3550334], [1.688...   \n",
       "4                                                NaN   \n",
       "\n",
       "                                              poison  \\\n",
       "0                                                NaN   \n",
       "1  [[3.818933], [4.03522], [3.9551923], [4.3191032]]   \n",
       "2                                                NaN   \n",
       "3                                                NaN   \n",
       "4  [[3.9875948], [3.946978], [4.097266], [3.64661...   \n",
       "\n",
       "                                               patch   0   1   2  \n",
       "0                                                NaN NaN NaN NaN  \n",
       "1                                                NaN NaN NaN NaN  \n",
       "2  [[0.98230016], [2.279613], [0.89635396], [1.38... NaN NaN NaN  \n",
       "3                                                NaN NaN NaN NaN  \n",
       "4                                                NaN NaN NaN NaN  "
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, description='Verifying the Discriminator', max=3158, style=ProgressStyle(d…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plot at step 0\n"
     ]
    },
    {
     "data": {
      "image/png": "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gQ8++IBVq1YNcdfS7pyWkeocd9xxzJgxg1WrVrFx40bOOOMMAD766CNOP/10ANasWcPNN9/Mjh07eOeddzjxxBP56le/OpRtS7sx3KU6RxxxBNA9537uuedy33337bZ9586dXHHFFbS3tzNu3Diuu+46L1nUsOO0jLQXM2bM4KmnnqKjowOAHTt28Oqrr+4K8qamJrZv3+7VMRqWPHOX9qK5uZnly5czb948Pvyw+1l4S5cuZdKkSVx22WVMnTqV1tZWpk2bNsSdSnsy3DVs9ffSxUZobW1lw4YNu5bPOuss1q5du0fd0qVLWbp06R7rly9fPpjtSZU5LSNJBTLcJalAhrskFchwl6QCGe6SVCDDXZIKZLhL++HSSy9l48aNQ92GtAevc9fwtebGxu7vy9c0dn/A3Xff3fB9So3gmbvUw5YtW/jiF7/IJZdcwkknncSFF17Ijh07eOyxxzjllFOYOnUq3/zmN3fdsTpz5kza29v55JNPWLBgAVOmTGHq1KnceuutALzwwgvMmDGDk046ia997Wu8++67u973gx/8gOnTpzNp0iSefPLJIRuzymS4S3U2bdrEokWLWL9+PWPHjuWWW25hwYIFPPDAA7z00kt0dXVxxx137PaeF154gTfeeIMNGzbw0ksvsXDhQgDmz5/PTTfdxPr165k6dSrXX3/9rvd0dXXx7LPPctttt+22XmoEw12qM27cuF2P+b344ot57LHHmDBhApMmdT8O4ZJLLuGJJ57Y7T3HH388mzdv5sorr+TnP/85Y8eO5f333+e9997jzDPP7PV9X//61wE47bTT2LJlywEYmQ4mhrtUZyBfTH300Ufz4osvMnPmTJYtW8all17a53sOP/xwAEaNGkVXV1e/P1PaF8NdqvPaa6/x9NNPA3DfffdxzjnnsGXLll2P/r333nt3nY1/5u233+bTTz/lggsu4IYbbmDdunUcddRRHH300bvm03t7nzRYvFpGqnPCCSewYsUKvv3tbzNx4kRuv/12ZsyYwUUXXURXVxfTpk3j8ssv3+09b7zxBgsXLuTTTz8F4MYbu6/0WbFiBZdffjk7duzg+OOP50c/+tEBH48OToa7hq9BuHSxikMOOYQ777xzt3Vnn302zz///B61jz/++K7X69at22P7ySefzDPPPLPP9zU1NTnnroZzWkaSCmS4Sz3Uf1mHNFIZ7pJUIMNdw0pmDnULw4b/L7Q/DHcNG2PGjGHbtm2GGt3Bvm3bNsaMGTPUrWiE8moZDRstLS10dnaydevWoW5lWBgzZgwtLS1D3YZGqErhHhGzgNuBUcDdmfnXddsPB34MnAZsA76RmVsa26pKN3r0aCZMmDDUbUhF6HNaJiJGAcuA84DJwLyImFxX9i3g3cz8XeBW4KZGNypJqq7KnPt0oCMzN2fmR8D9wJy6mjnAitrrh4CzYyAP6JAkNUSVcD8WeL3HcmdtXa81mdkFvA8c04gGJUn9V2XOvbcz8PrLGarUEBGLgEW1xe0RsanC5/fpqr5Lmq6CtxvxWf34zOGiiQaPfQRx7CPSn+9vfYWx9/czGm2/Pv+4KkVVwr0TGNdjuQV4cy81nRFxKHAU8E79jjLzLuCuKo01UkS0Z2bbgf7c4cCxO/aDzcE89p6qTMusBSZGxISIOAyYC6ysq1kJXFJ7fSHwi/RiZUkaMn2euWdmV0QsBh6m+1LIH2bmyxGxBGjPzJXAPcC9EdFB9xn73MFsWpK0b5Wuc8/M1cDqunXX9ni9E7iosa011AGfChpGHPvBybEf5MLZE0kqj8+WkaQCFRHuETEuItZExCsR8XJEfLeXmoiIv42IjohYHxGnDkWvg6Hi+GdGxPsR8ULt59re9jXSRMSYiHg2Il6sjf36XmoOj4gHasf+lxHReuA7bbyKY18QEVt7HPe+v7l7BImIURHxfESs6mVbkce9qlIeHNYFfD8z10XEkcBzEfFIZm7sUXMeMLH28yXgjtp/S1Bl/ABPZuZXhqC/wfQhcFZmbo+I0cB/RcTPMrPnd9vtejxGRMyl+/EY3xiKZhusytgBHsjMxUPQ34HwXeAVYGwv20o97pUUceaemb/KzHW11/9H98Guv4t2DvDj7PYM8PmI+MIBbnVQVBx/kWrHc3ttcXTtp/4PSUU+HqPi2IsVES3A7wN376WkyONeVRHh3lPtV69TgF/WbaryGIURbx/jBzi99iv8zyLixAPa2CCq/Wr+AvAW8Ehm7vXYl/Z4jApjB7igNhX5UESM62X7SHUb8GfAp3vZXuxxr6KocI+IzwE/Af4kM39dv7mXtxR1ltPH+NcBx2Xm7wF/B/z0QPc3WDLzk8w8me67p6dHxJS6kmKPfYWx/wfQmpknAY/ymzPZES0ivgK8lZnP7ausl3VFHPcqign32pzjT4B/zsx/66WkymMURqy+xp+Zv/7sV/jafQujI6LpALc5qDLzPeBxYFbdpl3Hfl+PxxjJ9jb2zNyWmR/WFv+R7u9cKMEZwOyI2EL3k2rPioh/qqsp/rjvSxHhXptHuwd4JTNv2UvZSmB+7aqZGcD7mfmrA9bkIKoy/oj4nc/mGyNiOt3HftuB63JwRERzRHy+9vq3gHOA/64rK/LxGFXGXvd3pdl0/z1mxMvMazKzJTNb6b4j/heZeXFdWZHHvapSrpY5A/hD4KXa/CN0P3ZtPEBm3kn3HbbnAx3ADmDhEPQ5WKqM/0LgjyKiC/gAmFvIP/QvACui+0tlDgEezMxVB8njMaqM/TsRMZvuK6reARYMWbcHwEFy3CvxDlVJKlAR0zKSpN0Z7pJUIMNdkgpkuEtSgQx3SSqQ4S5JBTLcJalAhrskFej/Ac4GayoPclnAAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plot at step 500\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plot at step 1000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plot at step 1500\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plot at step 2000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plot at step 2500\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAE9lJREFUeJzt3X+sVeWd7/H3V4bKxGpLBQ0jWHAKt1BxkB4ohuQWx2LVsaO2ciNJy4/WohGb/phkqv1Hq504bWakbeK1l6lU6nSwpj9S4zU6p1wa26RWjhQBZdATZfQIEQRrJRRb9Hv/2Au7kQPn1z57n8PzfiU7e+/vftbaz4PxfM561rPWicxEklSeE1rdAUlSaxgAklQoA0CSCmUASFKhDABJKpQBIEmFMgAkqVA9BkBETIiIdRGxNSKejIjPV/WbI+LFiNhYPS6p2+bGiOiMiG0R8dG6+kVVrTMibhicIUmSeiN6uhAsIsYB4zJzQ0ScDDwOXA78L2BfZv7L29pPA9YAs4G/An4OTKk+fhqYD3QB64GFmflU44YjSeqtv+ipQWbuBHZWr1+LiK3AGcfY5DLg3sx8HXguIjqphQFAZ2Y+CxAR91ZtjxoAY8aMyYkTJ/ZmHJKkyuOPP/5yZo7tqV2PAVAvIiYC5wK/AeYC10fEIqAD+IfMfIVaODxat1kXfw6MF95W/1A337EMWAZw5pln0tHR0ZcuSlLxIuK/e9Ou1yeBI+KdwI+BL2Tm74E7gb8GZlA7QvjXQ0272TyPUT+8kLkyM9sys23s2B4DTJLUT706AoiIkdR++P8gM38CkJkv1X3+b8AD1dsuYELd5uOBHdXro9UlSU3Wm1VAAdwFbM3M2+vq4+qaXQFsqV7fD1wVESdGxCRgMvAYtZO+kyNiUkS8A7iqaitJaoHeHAHMBT4FbI6IjVXtK8DCiJhBbRpnO3ANQGY+GRH3UTu5exBYnplvAETE9cDDwAhgVWY+2cCxSCrAn/70J7q6ujhw4ECru9Jyo0aNYvz48YwcObJf2/e4DLSV2tra0pPAkuo999xznHzyyZx66qnUJijKlJns2bOH1157jUmTJh32WUQ8npltPe3DK4ElDSsHDhwo/oc/QERw6qmnDuhIyACQNOyU/sP/kIH+OxgAklSoPl0IJklDzYr2pxu6vy/On9JzowFYsmQJl156KVdeeeWgfk9vGAA6quH2P5bUbJlJZnLCCcNzMmV49lqSWmT79u1MnTqV6667jpkzZ3LPPfdw3nnnMXPmTBYsWMC+ffsAuOWWW5g1axZnn302y5YtYyiuuDQAJKmPtm3bxqJFi2hvb+euu+7i5z//ORs2bKCtrY3bb69dL3v99dezfv16tmzZwh/+8AceeOCBHvbafE4BSVIfvfe972XOnDk88MADPPXUU8ydOxeAP/7xj5x33nkArFu3jm984xvs37+fvXv38oEPfICPfexjrez2EQwASeqjk046CaidA5g/fz5r1qw57PMDBw5w3XXX0dHRwYQJE7j55puH5JXLBoCaptEnlcETy2qtOXPmsHz5cjo7O3nf+97H/v376erq4rTTTgNgzJgx7Nu3jx/96EdDYtXP2xkAkoa1Vv4SMHbsWO6++24WLlzI66+/DsDXvvY1pkyZwmc/+1mmT5/OxIkTmTVrVsv6eCzeC0hHNRi/sTeaRwDl2bp1K1OnTm11N4aM7v49vBeQJOmYDABJKpQBIEmFMgAkqVAGgCQVygCQpEJ5HYCk4W3dbY3d3/k3NnR3V199NV/60peYNm1aQ/fbCAaAJA2i7373u63uwlE5BSRJfbB9+3be//73s3jxYs455xyuvPJK9u/fz9q1azn33HOZPn06n/70p9+6MnjevHl0dHTwxhtvsGTJEs4++2ymT5/OihUrANi4cSNz5szhnHPO4YorruCVV155a7svf/nLzJ49mylTpvDLX/6y4WMxACSpj7Zt28ayZcvYtGkTp5xyCrfffjtLlizhhz/8IZs3b+bgwYPceeedh22zceNGXnzxRbZs2cLmzZtZunQpAIsWLeLrX/86mzZtYvr06Xz1q199a5uDBw/y2GOP8c1vfvOweqMYAJLURxMmTHjrFtCf/OQnWbt2LZMmTWLKlNqtSRYvXswjjzxy2DZnnXUWzz77LJ/73Od46KGHOOWUU3j11Vf53e9+x4c//OFut/v4xz8OwAc/+EG2b9/e8HEYAJLURxHR521Gjx7NE088wbx587jjjju4+uqre9zmxBNPBGDEiBEcPHiwz9/ZEwNAkvro+eef59e//jUAa9as4SMf+Qjbt2+ns7MTgHvuueet3+oPefnll3nzzTf5xCc+wa233sqGDRt417vexejRo9+a3+9uu8HkKiBJ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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plot at step 3000\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAFu1JREFUeJzt3X+QlNW95/H3R5ZIymhEmFgsgxm8gQ0oXiQDjkXVBqMouuaiiVRJVcKPaEZXTeXHrV0lf6y/Ypmk9kqSKi8pbiCim4uh8qNCsazeCcEypoIwIPJDAs4qqyOUjKBGikAy+N0/+gy3gWGmZ6ane+B8XlVd3f3t8zx9jhbzmec853lGEYGZmeXnrGp3wMzMqsMBYGaWKQeAmVmmHABmZplyAJiZZcoBYGaWKQeAmVmmug0ASUMkrZf0sqTtkh5M9SckvS5pc3pMTHVJ+pGkFklbJE0q2tdcSa+mx9z+G5aZmXXnP5TQ5gjwuYg4KGkw8IKk/5M++28R8YsT2l8PjEmPK4BFwBWSLgDuB+qBADZKWhkR75ZjIGZm1jPdBkAULhU+mN4OTo+uLh+eCTyZtlsn6XxJI4BpQFNEHACQ1ATMAJafakfDhw+Purq6EoZhZmYdNm7c+E5E1HTXrpQjACQNAjYCnwIej4gXJf1X4BFJ/wNYA9wXEUeAkcCbRZu3ptqp6qdUV1dHc3NzKV00M7NE0v8rpV1JJ4Ej4mhETARqgSmSLgUWAJ8GJgMXAPd2fHdnu+iifhxJjZKaJTW3tbWV0j0zM+uFHq0Cioj3gOeAGRGxNwqOAD8FpqRmrcCoos1qgT1d1E/8jsURUR8R9TU13R7BmJlZL5WyCqhG0vnp9UeBa4A/pXl9JAm4CdiWNlkJzEmrgRqA9yNiL/AscK2koZKGAtemmpmZVUEp5wBGAMvSeYCzgBURsUrS7yTVUJja2QzcmdqvBm4AWoBDwHyAiDgg6WFgQ2r3UMcJYTOzUv3tb3+jtbWVw4cPV7srVTdkyBBqa2sZPHhwr7bXQP57APX19eGTwGZW7PXXX+fcc89l2LBhFCYg8hQR7N+/nw8++IDRo0cf95mkjRFR390+fCWwmZ1WDh8+nP0PfwBJDBs2rE9HQg4AMzvt5P7Dv0Nf/zs4AMzMMlXShWBmZgPVwqZdZd3fN6ePLev+TjRv3jxuvPFGbrnlln79nlI4AKxPyv2Pr0N//yM0K4eIICI466zTczLl9Oy1mVmV7N69m3HjxnHXXXcxadIknnrqKa688komTZrErFmzOHiwcOu0hx56iMmTJ3PppZfS2NjIQFxx6QAwM+uhnTt3MmfOHJqamliyZAm//e1v2bRpE/X19Tz22GMA3HPPPWzYsIFt27bxl7/8hVWrVlW51yfzFJCZWQ998pOfpKGhgVWrVvHKK68wdepUAP76179y5ZVXArB27Vq+//3vc+jQIQ4cOMAll1zC5z//+Wp2+yQOADOzHjrnnHOAwjmA6dOns3z58Xe1P3z4MHfddRfNzc2MGjWKBx54YEBeuewpIDOzXmpoaOAPf/gDLS0tABw6dIhdu3Yd+2E/fPhwDh48yC9+ceLfzRoYfARgZqe1aq4Yq6mp4YknnmD27NkcOXIEgO985zuMHTuWr371q0yYMIG6ujomT55ctT52xfcCsj7xMlCrtB07djBu3Lhqd2PA6Oy/h+8FZGZmXXIAmJllygFgZpYpB4CZWaYcAGZmmXIAmJllytcBmNnpbe2j5d3fVQvKurvbb7+db33rW4wfP76s+y0HB4CZWT/6yU9+Uu0unJKngMzMemD37t18+tOfZu7cuVx22WXccsstHDp0iDVr1nD55ZczYcIEvvKVrxy7MnjatGk0Nzdz9OhR5s2bx6WXXsqECRNYuHAhAJs3b6ahoYHLLruMm2++mXfffffYdvfeey9Tpkxh7Nix/P73vy/7WBwAZmY9tHPnThobG9myZQvnnXcejz32GPPmzePnP/85W7dupb29nUWLFh23zebNm3nrrbfYtm0bW7duZf78+QDMmTOH733ve2zZsoUJEybw4IMPHtumvb2d9evX84Mf/OC4erl0GwCShkhaL+llSdslPZjqoyW9KOlVST+X9JFUPzu9b0mf1xXta0Gq75R0XdlHY2ZWAaNGjTp2C+gvfelLrFmzhtGjRzN2bOEWJnPnzuX5558/bpuLL76Y1157ja997Ws888wznHfeebz//vu89957fPazn+10uy984QsAfOYzn2H37t1lH0cpRwBHgM9FxN8DE4EZkhqA7wELI2IM8C5wW2p/G/BuRHwKWJjaIWk8cCtwCTAD+GdJg8o5GDOzSpDU422GDh3Kyy+/zLRp03j88ce5/fbbu93m7LPPBmDQ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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "ename": "ValueError",
     "evalue": "all the input array dimensions except for the concatenation axis must match exactly",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-42-41f0a6506248>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     80\u001b[0m         \u001b[0;31m# adding real data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     81\u001b[0m         \u001b[0mreal_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moutput_real\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcpu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 82\u001b[0;31m         \u001b[0mreal_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreal_values\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"real\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\"real\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\"real\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m\"real\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     83\u001b[0m         \u001b[0mD_dataset\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mD_dataset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreal_values\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     84\u001b[0m         \u001b[0mpoison_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0moutput_poison\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcpu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/numpy/lib/function_base.py\u001b[0m in \u001b[0;36mappend\u001b[0;34m(arr, values, axis)\u001b[0m\n\u001b[1;32m   4692\u001b[0m         \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4693\u001b[0m         \u001b[0maxis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4694\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mconcatenate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   4695\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4696\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: all the input array dimensions except for the concatenation axis must match exactly"
     ]
    }
   ],
   "source": [
    "# BACK UP\n",
    "# This section will try to apply Discriminator to the whole dataset  \n",
    "\n",
    "# Load random test images for verifyting the algorithm \n",
    "\n",
    "D_dataset = np.array([]).reshape(0,2)\n",
    "\n",
    "pbar = tqdm_notebook(total=len(testloader), desc='Verifying the Discriminator')\n",
    "\n",
    "for i, data in enumerate(testloader):\n",
    "    pbar.update()\n",
    "    images, labels = data\n",
    "    images, labels = images.to(device), labels.to(device)\n",
    "    \n",
    "    real_inputs = images\n",
    "    images = poison(images)\n",
    "    poison_inputs = images\n",
    "    poison_inputs = poison_inputs.type('torch.FloatTensor')\n",
    "\n",
    "\n",
    "    real_inputs, poison_inputs = real_inputs.to(device), poison_inputs.to(device)\n",
    "\n",
    "\n",
    "    images = images.type('torch.FloatTensor') # poisoned inputs\n",
    "\n",
    "    images, labels = images.to(device), labels.to(device) # this is poisoned inputs\n",
    "\n",
    "    \n",
    "    \n",
    "    # This is to apply Grad CAM to the load images\n",
    "    # --------------------------------------------\n",
    "    probs, ids = gcam.forward(poison_inputs)\n",
    "\n",
    "    gcam.backward(ids=ids[:, [0]]) # 0 here is the top 1 classification result\n",
    "    regions = gcam.generate(target_layer=target_layer)\n",
    "    # --------------------------------------------------\n",
    "\n",
    "    with torch.no_grad():\n",
    "        \n",
    "\n",
    "        outputs = net(images)\n",
    "        _, predicted = torch.max(outputs, 1) # predited of poisoned inputs\n",
    "\n",
    "\n",
    "        patch_inputs = patching_inputs(images, predicted, regions)\n",
    "\n",
    "\n",
    "        # feed to the Discriminator \n",
    "\n",
    "        hole_area_real = gen_hole_area(size=(8, 8), mask_size=(32, 32))\n",
    "\n",
    "\n",
    "#         imgshow_imgs(real_inputs)\n",
    "#         imgshow_imgs(poison_inputs)\n",
    "#         imgshow_imgs(patch_inputs)\n",
    "\n",
    "        input_gd_poison = poison_inputs.detach()\n",
    "        input_ld_poison = crop(poison_inputs, hole_area_real)\n",
    "\n",
    "        input_gd_real = real_inputs.detach()\n",
    "        input_ld_real = crop(real_inputs, hole_area_real)\n",
    "\n",
    "\n",
    "        input_gd_patch = patch_inputs.detach()\n",
    "        input_ld_patch = crop(patch_inputs, hole_area_real)\n",
    "\n",
    "\n",
    "\n",
    "        output_ld_real, output_gd_real = model_cd(input_ld_real, input_gd_real)\n",
    "        \n",
    "        output_real = output_ld_real\n",
    "\n",
    "        output_ld_poison, output_gd_poison = model_cd(input_ld_poison, input_gd_poison)\n",
    "        output_poison = output_ld_poison\n",
    "\n",
    "        output_ld_patch, output_gd_patch = model_cd(input_ld_patch, input_gd_patch)\n",
    "        output_patch = output_ld_patch\n",
    "\n",
    "        # generate data to plot\n",
    "        # adding real data\n",
    "        real_values = output_real.cpu().numpy()\n",
    "        real_values = np.append(real_values, [[\"real\"], [\"real\"], [\"real\"], [\"real\"]], 1)\n",
    "        D_dataset = np.vstack((D_dataset, real_values))\n",
    "        poison_values = output_poison.cpu().numpy()\n",
    "        poison_values = np.append(poison_values, [[\"poison\"], [\"poison\"], [\"poison\"], [\"poison\"]], 1)\n",
    "        D_dataset = np.vstack((D_dataset, poison_values))\n",
    "        patch_values = output_patch.cpu().numpy()\n",
    "        patch_values = np.append(patch_values, [[\"patch\"], [\"patch\"], [\"patch\"], [\"patch\"]], 1)\n",
    "        D_dataset = np.vstack((D_dataset, patch_values))\n",
    "\n",
    "        if i % 500 == 0 : # update the plot every 10 iters\n",
    "            print(\"Plot at step %d\" % i)\n",
    "            df = pd.DataFrame(D_dataset)\n",
    "            df[0] = pd.to_numeric(df[0]) # convert the 1st col to numbers\n",
    "\n",
    "            real_dist = df.where(df[1]=='real')\n",
    "            real_dist = real_dist.dropna()\n",
    "\n",
    "            poison_dist = df.where(df[1]=='poison')\n",
    "            poison_dist = poison_dist.dropna()\n",
    "\n",
    "    #             patch_dist = df.where(df[1]=='patch')\n",
    "    #             patch_dist = patch_dist.dropna()\n",
    "\n",
    "\n",
    "            plt.hist(real_dist[0], alpha=0.5, label='real')\n",
    "            plt.hist(poison_dist[0], alpha=0.5, label='poison')\n",
    "    #             plt.hist(patch_dist[0], alpha=0.5, label='patch')\n",
    "\n",
    "            plt.legend()\n",
    "            plt.show()\n",
    "#         else:\n",
    "#             break\n",
    "pbar.close()\n",
    "\n",
    "\n",
    "\n",
    "# df = pd.DataFrame(D_dataset)\n",
    "# df[0] = pd.to_numeric(df[0]) # convert the 1st col to numbers\n",
    "\n",
    "    \n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 77544 entries, 0 to 77543\n",
      "Data columns (total 2 columns):\n",
      "0    77544 non-null float64\n",
      "1    77544 non-null object\n",
      "dtypes: float64(1), object(1)\n",
      "memory usage: 1.2+ MB\n"
     ]
    }
   ],
   "source": [
    "# sanity check the dataframe \n",
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    3.78705\n",
      "1       real\n",
      "dtype: object\n",
      "0    3.33682\n",
      "1     poison\n",
      "dtype: object\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "real_dist = df.where(df[1]=='real')\n",
    "real_dist = real_dist.dropna()\n",
    "\n",
    "max_real = real_dist.max()\n",
    "print(max_real)\n",
    "poison_dist = df.where(df[1]=='poison')\n",
    "poison_dist = poison_dist.dropna()\n",
    "min_poison = poison_dist.min()\n",
    "print(min_poison)\n",
    "\n",
    "\n",
    "\n",
    "# patch_dist = df.where(df[1]=='patch')\n",
    "# patch_dist = patch_dist.dropna()\n",
    "\n",
    "bins = np.linspace(0,10,100)\n",
    "\n",
    "plt.hist(real_dist[0], bins, alpha=0.5, label='real')\n",
    "plt.legend()\n",
    "plt.show()\n",
    "plt.hist(poison_dist[0], bins, alpha=0.5, label='poison')\n",
    "plt.legend()\n",
    "plt.show()\n",
    "# plt.hist(patch_dist[0], bins, alpha=0.5, label='patch')\n",
    "\n",
    "# plt.legend()\n",
    "# plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "Unknown property stack",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-254-14ba3e0d60f5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mhist\u001b[0;34m(x, bins, range, density, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, normed, data, **kwargs)\u001b[0m\n\u001b[1;32m   2657\u001b[0m         \u001b[0malign\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malign\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morientation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morientation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrwidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2658\u001b[0m         \u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstacked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstacked\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnormed\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnormed\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2659\u001b[0;31m         **({\"data\": data} if data is not None else {}), **kwargs)\n\u001b[0m\u001b[1;32m   2660\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2661\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1808\u001b[0m                         \u001b[0;34m\"the Matplotlib list!)\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1809\u001b[0m                         RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1810\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1811\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1812\u001b[0m         inner.__doc__ = _add_data_doc(inner.__doc__,\n",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mhist\u001b[0;34m(self, x, bins, range, density, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, normed, **kwargs)\u001b[0m\n\u001b[1;32m   6779\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mpatch\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   6780\u001b[0m                 \u001b[0mp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpatch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 6781\u001b[0;31m                 \u001b[0mp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   6782\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mlbl\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   6783\u001b[0m                     \u001b[0mp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_label\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlbl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/matplotlib/artist.py\u001b[0m in \u001b[0;36mupdate\u001b[0;34m(self, props)\u001b[0m\n\u001b[1;32m    914\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    915\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mcbook\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setattr_cm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0meventson\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 916\u001b[0;31m             \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0m_update_property\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    917\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    918\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mret\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/matplotlib/artist.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    914\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    915\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mcbook\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_setattr_cm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0meventson\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 916\u001b[0;31m             \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0m_update_property\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mprops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    917\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    918\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mret\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/pytorch/lib/python3.7/site-packages/matplotlib/artist.py\u001b[0m in \u001b[0;36m_update_property\u001b[0;34m(self, k, v)\u001b[0m\n\u001b[1;32m    910\u001b[0m                 \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'set_'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    911\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 912\u001b[0;31m                     \u001b[0;32mraise\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Unknown property %s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    913\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    914\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mAttributeError\u001b[0m: Unknown property stack"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(df[0], stack=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
